您现在的位置是:首页 > JAVA教程 > 正文

Java类的加载顺序详解:包括静态与非静态部分执行次序及构造函数调用规则

编辑:本站更新:2024-06-02 20:18:58人气:9696
在深入探讨 Java 类的加载顺序时,我们首先要明确几个关键的概念。Java 虚拟机(JVM)遵循一套严格的机制来查找、装载并初始化一个类以及它的成员变量和方法。这个过程涉及到了静态块、实例初始化块、构造器以及其他相关元素按照特定顺序的操作。

**1. 加载阶段**

当程序首次主动使用某个类时,JVM 会通过ClassLoader系统找到对应的 .class 文件,并完成字节码数据的读取解析生成Class对象的过程,这就是所谓的“加载”或"链接”的准备环节。此步骤并不涉及到任何代码的实际执行,仅是为后续操作做基础设置。

**2. 链接阶段 - 准备(Preparation)**

在这一步骤中,对于类级别的static字段, JVM会给它们分配内存空间并且默认赋初始值 (0 / false/null 对应于基本类型/引用类型) 。但请注意,这里的 static 字段并非实际被赋予其声明中的初识化表达式的值,那将在下一步进行。

**3. 链接阶段 - 解析(Initialized)**

接着是对符号引用替换为直接引用的过程,同时对所有静态成员变量进行真正的初始化处理——即运行这些静态初始化语句块(`static { ... }`) 和给每个已定义且有显式初始化器(static int x = 5;) 的静态字段按源码指定的方式賦值。注意这里有个重要特性:如果父类中有静态初始化块或者静态属性,则先执行父类的相关内容再转至子类。

**4. 初始化(Initialized)**

初始化阶段发生在真正创建类的第一个实例之前或是访问/调用该类的静态绑定方法/static字段之时。此时不仅会对剩余未初始化的所有静态字段依照他们在类结构中的出现顺序依次执行初始化逻辑;也会触发各个实例初始化块 (`{...}`),这些块内的代码会在每次新建实例前被执行一次。

- **构造函数调用规则**:
创建新对象时首先会寻找合适的构造函数,它可能是一个无参构造函数或者是匹配传入参数类型的带参构造函数。一旦确定了要使用的构造器后:

i. 构造函数的第一行隐含地包含了对其超类相应构造函数的调用。

ii. 紧随其后的就是当前类的实例初始化块,在其中可以进一步定制对象的状态。

iii. 最终才会逐条执行构造函数内部的具体实现细节。

总结起来,从整体上看,Java 中各类及其成员的加载顺序大致如下:

1. 根据需要由 ClassLoader 进行类加载
2. 执行对应 class 的准备工作(如分配内存等)
3. 按照层级关系递归执行静态初始化(包含 `static` 块和静态字段初始化),自上而下(祖先到后代)
4. 当创建具体对象时:
a. 先调用超类的构造函数直至 Object 类;
b. 再逐一执行各层继承链上的实例初始化块;
c. 接着继续本类构造函数的内容。

理解这一系列有序的动作流程有助于开发者更好地把握代码的行为表现,并能有效地避免由于不明就里而导致的各种潜在问题。
关注公众号

www.php580.com PHP工作室 - 全面的PHP教程、实例、框架与实战资源

PHP学习网是专注于PHP技术学习的一站式在线平台,提供丰富全面的PHP教程、深入浅出的实例解析、主流PHP框架详解及实战应用,并涵盖PHP面试指南、最新资讯和活跃的PHP开发者社区。无论您是初学者还是进阶者,这里都有助于提升您的PHP编程技能。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

最新推荐

本月推荐